// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package syntax

type token uint

// go:生成stringer-type标记-linecomment标记。go 

const (
	_    token = iota
	_EOF       // EOF 

	// name and literals 
	_Name    // name 
	_Literal // literal 

	// Operator and operations 
	// （u Star）
	_Operator // op 
	_AssignOp // op=
	_IncOp    // opp 

	// /分隔符
	_Lparen    // （
	_Lbrack    // [
	_Lbrace    // {
	_Rparen    // ）
	_Rbrack    // ]
	_Rbrace    // 
	_Comma     // ，
	_Semi      // ；
	_Colon     // /：
	_Dot       // /。
	_DotDotDot // /。。。

	// 关键字
	_Break       // 中断
	_Case        // 案例
	_Chan        // 更改
	_Const       // 常数
	_Continue    // 继续
	_Default     // 默认
	_Defer       // 延迟
	_Else        // 其他
	_Fallthrough // 失败
	_For         // 为
	_Func        // 函数
	_Go          // 转到
	_Goto        // 转到
	_If          // 如果
	_Import      // 导入
	_Interface   // 接口
	_Map         // 映射
	_Package     // 包
	_Range       // 范围
	_Return      // 返回
	_Select      // 选择
	_Struct      // 结构
	_Switch      // 切换
	_Type        // 类型
	_Var         // var 

	// 要将其从中排除的空行注释。字符串
	tokenCount // 
)

const (
	// 对于BranchStmt 
	Break       = _Break
	Continue    = _Continue
	Fallthrough = _Fallthrough
	Goto        = _Goto

	// 对于CallStmt 
	Go    = _Go
	Defer = _Defer
)

// 确保我们最多有64个令牌，以便我们可以在一组中使用它们。
const _ uint64 = 1 << (tokenCount - 1)

// 包含tok是否在tok集合中的报告。
func contains(tokset uint64, tok token) bool {
	return tokset&(1<<tok) != 0
}

type LitKind uint8

// TODO（gri）现在允许在整数
// 和浮点数上使用'i'（虚）后缀，使用单个ImagLit不能很好地代表字面类型。移除它？
const (
	IntLit LitKind = iota
	FloatLit
	ImagLit
	RuneLit
	StringLit
)

type Operator uint

// go:生成stringer-type运算符-linecomment标记。go 

const (
	_ Operator = iota

	// Def是：in:=
	Def   // :
	Not   // ！
	Recv  // /<-
	Tilde // /~

	// /预错误
	OrOr // /| 

	// /预损坏
	AndAnd // /&&

	// precCmp 
	Eql // /==
	Neq // /=
	Lss // /<
	Leq // /<=
	Gtr // />
	Geq // />=

	// 预加
	Add // +
	Sub // /-
	Or  // /| 
	Xor // /^

	Shr    // />>
)

// 操作员先例
const (
	_ = iota
	precOrOr
	precAndAnd
	precCmp
	precAdd
	precMul
)
